package h.c.z.designPattern.C02_SingletonPattern;

/**
 * 说明：单例测试
 * @author jinsicao
 * @version 2018年10月23日
 */
public class SingletonTest {

	public static void main(String[] args) {

		// 饿汉式（静态常量）[可用]
//		testSingleton_01();
		
		// 单例模式-懒汉式(线程不安全)（一）[不可用]
//		testSingleton_02_01();
		
		// 懒汉(线程安全，同步方法)（二）[不推荐用]
//		testSingleton_02_02();
		
		// 懒汉式(线程安全，同步代码块)（三）[不可用]
//		testSingleton_02_03();
		
		// 懒汉式，双重检查（三）[推荐用]
//		testSingleton_02_04();
		
		// 静态内部类[推荐用]
//		testSingleton_03();
		
		// 枚举类 [推荐用]
		testSingleton_04();
	}
	
	/**
	 * 饿汉式（静态常量）[可用]
	 */
	public static void testSingleton_01() {
		new Thread(() -> {
			for (int i = 0; i < 3; i++) {
				new Thread(() -> {
					System.out.println(Singleton_01.getInstance());
				}).start();
			}
		}).start();
	}
	
	/**
	 * 单例模式-懒汉式(线程不安全)（一）[不可用]
	 */
	public static void testSingleton_02_01() {
		new Thread(() -> {
			for (int i = 0; i < 3; i++) {
				new Thread(() -> {
					System.out.println(Singleton_02_01.getInstance());
				}).start();
			}
		}).start();
	}
	
	/**
	 * 懒汉(线程安全，同步方法)（二）[不推荐用]
	 */
	public static void testSingleton_02_02() {
		new Thread(() -> {
			for (int i = 0; i < 3; i++) {
				new Thread(() -> {
					System.out.println(Singleton_02_02.getInstance());
				}).start();
			}
		}).start();
	}
	
	/**
	 * 懒汉式(线程安全，同步代码块)（三）[不可用]
	 */
	public static void testSingleton_02_03() {
		new Thread(() -> {
			for (int i = 0; i < 3; i++) {
				new Thread(() -> {
					System.out.println(Singleton_02_03.getInstance());
				}).start();
			}
		}).start();
	}
	
	/**
	 * 懒汉式，双重检查（三）[推荐用]
	 */
	public static void testSingleton_02_04() {
		new Thread(() -> {
			for (int i = 0; i < 5; i++) {
				new Thread(() -> {
					System.out.println(Singleton_02_04.getInstance());
				}).start();
			}
		}).start();
	}
	
	/**
	 * 静态内部类[推荐用]
	 */
	public static void testSingleton_03() {
		new Thread(() -> {
			for (int i = 0; i < 3; i++) {
				new Thread(() -> {
					System.out.println(Singleton_03.getInstance());
				}).start();
			}
		}).start();
	}
	
	/**
	 * 枚举类 [推荐用]
	 */
	public static void testSingleton_04() {
		new Thread(() -> {
			for (int i = 0; i < 3; i++) {
				new Thread(() -> {
					System.out.println(Singleton_04.INSTANCE);
				}).start();
			}
		}).start();
	}

}
